home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / oper_sys / emerald / emrldsys.lha / ErrCodes / errMsgs.c
C/C++ Source or Header  |  1990-08-17  |  4KB  |  176 lines

  1. /* File: /u1/oystr/ErrCodes/errMsgs.c  Date: 23-Nov-1982  */
  2.  
  3. /*
  4.  * $Header$
  5.  * INTERFACE:    These routines provide and interface to the Eden
  6.  *        Message Retrieval system.  This turkey is a direct
  7.  *        clone of the VMS $GETMSG/$PUTMSG facility.
  8.  *
  9.  * FUNCTION:    Access the error message database and string table.
  10.  *
  11.  * IMPORTS:    errMsg.h, dbm(3X) (multichannel) functions.
  12.  *
  13.  * EXPORTS:    GetEdenMsg, PutEdenMsg, DisplayEdenMsg
  14.  *
  15.  * DESIGN:    See "Eden Error Message Retrieval System", J. Sanislo,
  16.  *        TBS
  17.  *
  18.  * $Log$
  19.  * 23-Nov-1982:    Initial implementation. J. Sanislo.
  20.  * 24-Jan-1983:    Modified for multiple channel dbm. J. Sanislo.
  21.  */
  22. #include "errMsgs.h"
  23. #include <stdio.h>
  24. #include "system.h"
  25. #undef NULL
  26. #include <dbm.h>
  27.  
  28. #define cdbminit(xxx) dbminit(xxx)
  29. #define cfetch(fChannel, fKey) fetch(fKey)
  30. #define cstore(fChannel, fKey, fContent) store(fKey, fContent)
  31.  
  32. #define MAXMSGLEN 128
  33.  
  34. /* 
  35.  * One file does it all.  The strings are kept in EdenErrStr.
  36.  * The database files EdenErrStr.dir and EdenErrStr.pag maintain
  37.  * (key, content) pairs of (errorcode value, offset in string file).
  38.  */
  39. char efilname[] = "/usr/projects/emerald/ErrCodes/EdenErrStr";
  40.  
  41. int efil = -1;            /* >= 0 => stringfile already open */
  42. char NoMsg[] = "NONAME-F: No message for code: %8.8x";
  43. char NoText[] = "No text for code: %8.8x";
  44. char ECSuffix[] = "WSFIKM";
  45.  
  46. int dfil = -1;
  47.  
  48. /*ARGSUSED*/
  49. int GetEdenMsg(fEC,fBufSize,fBuffer, fFlags)
  50.     int  fEC;
  51.     int  fBufSize;
  52.     char fBuffer[];
  53.     int  fFlags;
  54. {
  55. #if defined(NODISK) || defined(xkernel)
  56.     return(EMRK_AccStr);
  57. #else    
  58.     datum key, content;
  59.     int   offset;
  60.     char  buf[MAXMSGLEN];
  61.     int   localint;
  62.     int   headlen;
  63.     
  64.     if (efil < 0) {
  65.     efil = open(efilname,0);
  66.     if (efil < 0) {
  67.         perror(efilname);
  68.         return(EMRK_AccStr);
  69.     }
  70.     }
  71.     if (dfil < 0 ) {
  72.     dfil = cdbminit(efilname);
  73.     if (dfil < 0) {
  74.         perror(efilname);
  75.         return(EMRK_InitDB);
  76.     }
  77.     }
  78.  
  79. /*
  80.  * Get the abbreviation associated with the facility code.
  81.  */
  82.     localint = ( (unsigned) fEC ) >> 16;
  83.     key.dsize = 4;
  84.     key.dptr  = (char *) &localint;
  85.     content = cfetch(dfil, key);
  86.     if (content.dptr == NULL) {
  87.         sprintf(buf,NoMsg,fEC);
  88.         if ( (strlen(buf)+1) > fBufSize)
  89.         buf[fBufSize-2] = '\0';
  90.         (void) strcpy(fBuffer,buf);
  91.         return(EMRF_NoMsg);
  92.     }
  93. /*       return( makeNullMsg(fEC,fBufSize,fBuffer) ); */
  94.  
  95.     offset = * (int *) content.dptr;
  96.     if (lseek(efil, (long) offset, 0) < 0)
  97.         return(EMRK_AccStr);
  98.     if (read(efil, buf, MAXMSGLEN) <= 0)
  99.     return(EMRK_AccStr);
  100.  
  101.     (void) strcat(buf,"- : ");
  102.     headlen = strlen(buf);
  103.  
  104.     localint = fEC;
  105.     key.dsize = 4;
  106.     key.dptr  = (char *) &localint;
  107.     content = cfetch(dfil, key);
  108.  
  109.     if (content.dptr == NULL) {
  110.     buf[headlen-3] = 'F';
  111.     sprintf(&buf[headlen], NoText, fEC);
  112.         if ( (strlen(buf)+1) > fBufSize)
  113.         buf[fBufSize-2] = '\0';
  114.         (void) strcpy(fBuffer,buf);
  115.         return(EMRF_NoMsg);
  116.     }
  117.     
  118. /*       return(makeNullMsg(fEC,fBufSize,fBuffer)); */
  119.  
  120.     offset = * (int *) content.dptr;
  121.     if (lseek(efil, (long) offset, 0) < 0)
  122.         return(EMRK_AccStr);
  123.     if (read(efil, &buf[headlen], MAXMSGLEN - headlen) <= 0)
  124.     return(EMRK_AccStr);
  125.  
  126.     buf[headlen-3] = ECSuffix[fEC % MODULUS];
  127.  
  128.     if ( (strlen(buf)+1) <= fBufSize) {
  129.     (void) strcpy(fBuffer,buf);
  130.     return(EMRS_Success);
  131.     }
  132.     else {
  133.     buf[fBufSize-2] = '\0';
  134.     (void) strcpy(fBuffer,buf);
  135.     return(EMRW_MsgTrunc);
  136.     }
  137. #endif
  138. }                /* End of GetEdenMsg */
  139.  
  140. /*ARGSUSED*/
  141. int PutEdenMsg(fEC, fOut, fArgv)
  142. int  fEC;
  143. FILE *fOut;
  144. char *fArgv[];
  145. {
  146.   char buf[MAXMSGLEN];
  147.   int  status;
  148. #ifndef xkernel
  149.   FILE *outfile;
  150. #endif
  151.     
  152.   status = GetEdenMsg(fEC,MAXMSGLEN,buf,0);
  153. #ifdef BSD
  154.   if ( fOut != 0 ) outfile = fOut;
  155.   else outfile = stderr;
  156. #endif
  157.   if ( mNOERROR(status) || (status == EMRF_NoMsg) )
  158. #ifdef BSD
  159.     fprintf(outfile,"%s\n",buf);
  160. #else
  161.   printf("%s\n",buf);
  162. #endif
  163.   return(status);
  164. }
  165.  
  166. int DisplayEdenMsg(fString)
  167. char fString[];
  168. {
  169. #ifdef BSD
  170.   fprintf(stderr,"%s\n",fString);
  171. #else
  172.   printf("%s\n",fString);
  173. #endif
  174.   return(EMRS_Success);
  175. }
  176.